package co.gov.medellin.ssti.sub.service;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;

import javax.naming.NamingException;

import co.gov.medellin.ssti.sub.common.ConexionFactory;
import co.gov.medellin.ssti.sub.model.dao.DAOFactory;
import co.gov.medellin.ssti.sub.model.dao.IRenovarDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.BeneficiarioVO;

public class RenovarService {
	/**
	 * Metodo que consulta CODIGO, NOMBRE, TIPO_DATO, TIPO_ATRIBUTO de
	 * TCS_BEN_SUBP_ATR_BENEFICIARIO buscando por SBPR_CODIGO.
	 * 
	 * @param codeSubpro
	 *            Codigo del subprograma.
	 * @return Collection de AtributoVO.
	 * @throws DAOException
	 */
	public Collection<AtributoVO> findAtributosSubpro(Long codeSubprograma)
			throws DAOException {
		IRenovarDAO renovarDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			renovarDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getRenovarDAO(con);
			return renovarDAO.findAtributosSubpro(codeSubprograma);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (renovarDAO != null) {
				if (!renovarDAO.isConnClosed()) {
					renovarDAO.close();
				}
			}
		}
	}

	/**
	 * Metodo que consulta VALOR_NUM_ATR o VALOR_FEC_ATR o VALOR_CAR_ATR segun
	 * tipoDato en TCS_BEN_BENEFICIARIO_ATRIBUTO buscando por SAB_CODIGO y
	 * BEN_CODIGO.
	 * 
	 * @param tipoDato
	 *            "N": VALOR_NUM_ATR. "F": VALOR_FEC_ATR. Cualquier otro valor:
	 *            VALOR_CAR_ATR.
	 * @param codeBene
	 *            Codigo del beneficiario.
	 * @param codeAtri
	 *            Codigo del atributo.
	 * @return
	 * @throws DAOException
	 */
	public String findBeneficiarioAtri(String tipoDato, Long codeBene,
			Long codeAtri) throws DAOException {
		IRenovarDAO renovarDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			renovarDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getRenovarDAO(con);
			return renovarDAO
					.findBeneficiarioAtri(tipoDato, codeBene, codeAtri);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (renovarDAO != null) {
				if (!renovarDAO.isConnClosed()) {
					renovarDAO.close();
				}
			}
		}
	}

	/**
	 * TODO: que no retorne RS! Metodo que consulta VALOR_NUM_ATR o
	 * VALOR_FEC_ATR o VALOR_CAR_ATR segun tipoDato en
	 * TCS_BEN_BENEFICIO_ATRIBUTO buscando por SAB_CODIGO y BOT_CODIGO.
	 * 
	 * @param tipoDato
	 *            "N": VALOR_NUM_ATR. "F": VALOR_FEC_ATR. Cualquier otro valor:
	 *            VALOR_CAR_ATR.
	 * @param codeBeneOtor
	 *            Codigo del beneficio otorgado.
	 * @param codeAtri
	 *            Codigo del atributo.
	 * @return
	 * @throws DAOException
	 */
	public ResultSet findBeneficioAtri(String tipoDato, Long codeBeneOtor,
			Long codeAtri) throws DAOException {
		IRenovarDAO renovarDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			renovarDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getRenovarDAO(con);
			return renovarDAO.findBeneficioAtri(tipoDato, codeBeneOtor,
					codeAtri);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (renovarDAO != null) {
				if (!renovarDAO.isConnClosed()) {
					renovarDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param codeSubpro
	 *            Codigo del subprograma.
	 * @param codeBene
	 *            Codigo del beneficiario.
	 * @return
	 * @throws DAOException
	 */
	public List<String> findBeneficioOtorgado(Long codeSubpro, Long codeBene)
			throws DAOException {
		IRenovarDAO renovarDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			renovarDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getRenovarDAO(con);
			return renovarDAO.findBeneficioOtorgado(codeSubpro, codeBene);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (renovarDAO != null) {
				if (!renovarDAO.isConnClosed()) {
					renovarDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param codeSubpro
	 *            Codigo del subprograma.
	 * @param codeBene
	 *            Codigo del beneficiario.
	 * @param codeSede
	 *            Codigo de la sede.
	 * @throws DAOException
	 */
	public void findBeneOtorDeshabilitar(Long codeSubpro, Long codeBene,
			Long codeSede) throws DAOException {
		IRenovarDAO renovarDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			renovarDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getRenovarDAO(con);
			renovarDAO.findBeneOtorDeshabilitar(codeSubpro, codeBene, codeSede);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (renovarDAO != null) {
				if (!renovarDAO.isConnClosed()) {
					renovarDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param codeSubpro
	 *            Codigo del subprograma.
	 * @param codeSede
	 *            Codigo de la sede.
	 * @return
	 * @throws DAOException
	 */
	public List<BeneficiarioVO> findBeneficiarios(Long codeSubpro, Long codeSede)
			throws DAOException {
		IRenovarDAO renovarDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			renovarDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getRenovarDAO(con);
			return renovarDAO.findBeneficiarios(codeSubpro, codeSede);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (renovarDAO != null) {
				if (!renovarDAO.isConnClosed()) {
					renovarDAO.close();
				}
			}
		}
	}
}
